package repositorio;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import dados.Amostra;
import dados.Central;
import dados.Especialista;
import dados.Resultado;

public class RepositorioResultado extends SentencasBD {

	public RepositorioResultado(ConexaoBD conexao) {
		super(conexao, 1, 1, 1, 2);
		
		this.cadastro[0] = "INSERT INTO tb_resultado (id, obs, data, descricao, especialista, central, " +
					"amostras) VALUES (?, ?, ?, ?, (SELECT REF(C) FROM tb_especialista C WHERE C.id =  ?), " +
					"(SELECT REF(C) FROM tb_central C WHERE C.id =  ?), ";
		this.atualizacao[0] = "UPDATE tb_resultado SET obs = ?, data = ?, descricao = ?, especialista = " +
						      "(SELECT REF(C) FROM tb_especialista C WHERE C.id =  ?), central = " +
						      "(SELECT REF(C) FROM tb_central C WHERE C.id =  ?), amostras = ";
		this.consulta[0] = "SELECT * FROM tb_resultado A WHERE A.id = ?";
		this.consulta[1] = "SELECT A.id, A.obs, A.data, A.descricao FROM tb_resultado A";
		this.remocao[0] = "DELETE FROM tb_resultado WHERE id = ?";
	}
	
	public void inserir(Resultado r) throws SQLException{
		String amostras = "tp_nt_amostra(";
		for(int i = 0; i < r.getAmostras().size(); i++){
			Amostra ce = r.getAmostras().get(i);
			amostras += "(SELECT REF(C) FROM tb_amostra C WHERE C.id = " + ce.getId() + ")";
			if(i != r.getAmostras().size()-1)
				amostras += ",";
		}
		amostras += ")";
		
		Connection c = conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.cadastro[0] + amostras + ")");
		ps.setInt(1, r.getId());
		ps.setString(2, r.getObservacao());
		ps.setDate(3, r.getData());
		ps.setString(4, r.getDescricao());
		ps.setInt(5, r.getEspecialista().getId());
		ps.setInt(6, r.getCentral().getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void editar(Resultado r) throws SQLException{
		String amostras = "tp_nt_amostra(";
		for(int i = 0; i < r.getAmostras().size(); i++){
			Amostra ce = r.getAmostras().get(i);
			amostras += "(SELECT REF(C) FROM tb_amostra C WHERE C.id = " + ce.getId() + ")";
			if(i != r.getAmostras().size()-1)
				amostras += ",";
		}
		amostras += ")";
		
		Connection c = conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.atualizacao[0] + amostras + " WHERE id = ?");
		ps.setString(1, r.getObservacao());
		ps.setDate(2, r.getData());
		ps.setString(3, r.getDescricao());
		ps.setInt(4, r.getEspecialista().getId());
		ps.setInt(5, r.getCentral().getId());
		ps.setInt(6, r.getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void remover(int id) throws SQLException{
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.remocao[0]);
		ps.setInt(1, id);
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	private List<Amostra> pegarAmostras(int id) throws SQLException {
		String sql = "SELECT DEREF(ss.COLUMN_VALUE).id, DEREF(ss.COLUMN_VALUE).integridade, " +
			"DEREF(ss.COLUMN_VALUE).data FROM TABLE(SELECT C.amostras FROM tb_resultado C WHERE C.id = ?) ss";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Amostra temp = null;
		List<Amostra> ret = new ArrayList<Amostra>();
		while(set.next()){
			temp = new Amostra(set.getInt(1), set.getString(2), set.getDate(3), null);
			ret.add(temp);
		}
		return ret;
	}
	
	private Central pegarCentral(int id) throws SQLException{
		String sql = "SELECT DEREF(C.central).id, DEREF(C.central).numero_licenca, DEREF(C.central).nome," +
					 " DEREF(C.central).endereco FROM tb_resultado C WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Central ret = null;
		if(set.next())
			ret = new Central(set.getInt(1), set.getLong(2), set.getString(3), set.getString(4));
		
		return ret;
	}
	
	private Especialista pegarEspecialista(int id) throws SQLException{
		String sql = "SELECT DEREF(C.especialista).id, DEREF(C.especialista).nome, " +
					 "DEREF(C.especialista).cpf, DEREF(C.especialista).rg FROM tb_resultado C " +
					 "WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Especialista temp = null;
		if(set.next()){
			temp = new Especialista(set.getInt(1), set.getString(2), set.getLong(3), set.getLong(4));
		}
		
		return temp;
	}
	
	public Resultado buscar(int id) throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[0]);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Resultado temp = null;
		if(set.next()){			
			temp = new Resultado(set.getInt(1), set.getString(3), set.getDate(4), set.getString(5)); 
			temp.setCentral(this.pegarCentral(id));
			temp.setEspecialista(this.pegarEspecialista(id));
			temp.setAmostras(this.pegarAmostras(id));
		}
		return temp;
	}
	
	public Iterator<Resultado> iterator() throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[1]);
		ResultSet set = ps.executeQuery();
		Resultado temp = null;
		List<Resultado> all = new ArrayList<Resultado>(); 
		while(set.next()){			
			temp = new Resultado(set.getInt(1), set.getString(2), set.getDate(3), set.getString(4)); 
			all.add(temp);
		}
		return all.iterator();
	}
	
	/*
	public static void main(String[] args) {
		try {
			ConexaoBD c = new ConexaoBD("oracle.jdbc.driver.OracleDriver",
						"jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc", 
						"g101if685_eq02", "equipe2gdi");
			RepositorioResultado r = new RepositorioResultado(c);
			Resultado result = new Resultado(999, "obs1", new Date(789654321), "desc1");
			List<Amostra> amostras = new ArrayList<Amostra>();
			amostras.add(new Amostra(1214));
			result.setAmostras(amostras);
			result.setCentral(new Central(1457));
			result.setEspecialista(new Especialista(10104));
			r.inserir(result);
			System.out.println("INSERIU");
			Resultado teste = r.buscar(999);
			System.out.println("- Amostras do resultado buscado: ");
			for(Amostra a : teste.getAmostras())
				System.out.println("  " + a.getId() + "-" + a.getIntegridade());
			result.getAmostras().add(new Amostra(555));
			System.out.println("Mandando atualizar...");
			r.editar(result);
			teste = r.buscar(999);
			for(Amostra a : teste.getAmostras())
				System.out.println("  " + a.getId() + "-" + a.getIntegridade());
		} catch (ClassNotFoundException e) {
			System.out.println(">> erro1");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println(">> erro2");
			e.printStackTrace();
		}
	}*/
}
